/**
 * 标准化数据，常用于处理后端数据
 * @description
 * 会基于原始数据生成新的数据，并做如下处理：
 * 1. 删除值为 `null` 和 `undefined` 的字段
 * 2. 如果 `keyMap` 中配置了原始字段和新的字段，则更改字段的名称为新的字段
 * 3. 如果 `keyMap` 中配置了原始字段，新的 字段为空，则删除该字段
 * 4. 如果字段为 `is` 开头，并且值为数字类型，则转换值为布尔类型
 * @param origin - 原始数据
 * @param keyMap - 替换字段名，可选，`{ oldKey: newKey }`, `newKey` 为空则去除该字段
 * @returns object - 格式化后新的数据
 */
export function normalizeModel(origin: object, keyMap: { [key: string]: string } = {}) {
  const data: { [key: string]: unknown } = {}

  Object.entries(origin).forEach(([key, val]) => {
    // 过滤无意义数据
    if (val === null || val === undefined) return

    // 存在替换字段则用新的 key
    key = key in keyMap ? keyMap[key] : key

    // 字段替换
    key && (data[key] = val)

    // is 开头属性，且值为数字时转换为布尔值
    if (/^is[A-Z]/.test(key) && typeof val === 'number') {
      data[key] = !!val
    }
  })

  return data
}

/**
 * 队列处理数据，返回的数据依次交由下一个程序处理
 */
export function processData<T>(data: T, ...handlers: ((val: T) => T)[]) {
  return handlers.reduce((val, handler) => handler(val), data)
}
